home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side A).zip
/
Nibble Volume 09, No. 07 (1988-07)(MicroSPARC)(Side A).po
/
NEWSMAKER.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
21KB
|
813 lines
********************************
* NewsMaker
* by John J. Gwynn
* Copyright (c) 1988
* by MicroSPARC, Inc.
* Concord, MA 01742
* Merlin Pro Assembler
********************************
*
*---Monitor-----------------------
*
HOME EQU $FC58 ;applesoft home
COUT EQU $FDED ;monitor char output
CROUT EQU $FD8E ;<cr> out
GETLN EQU $FD6A ;monitor string input
RDKEY EQU $FD0C ;monitor key input
STROUT EQU $DB3A ;applesoft string print
VTAB EQU $FC22 ;cursor vtab
KEYBD EQU $C000 ;keyboard read
STROBE EQU $C010 ;reset keyboard read
*
*---ProDOS-------------------------
*
MLI EQU $BF00 ;MLI entry
LEVEL EQU $BF94 ;level of access for MLI
BITMAP EQU $BF58 ;ProDOS Global Page bit map
DOSCMD EQU $BE03 ;vector for command processing
BADCALL EQU $BE8B ;convert mli error to basic.sys
PRINTERR EQU $BE0C ;print system error
*
*---Page Zero----------------------
*
PAGE EQU $00
PROMPT EQU $33 ;location of prompt char
TXTLFT EQU $20 ;left margin of text window
CH EQU $24 ;cursor horizontal
CV EQU $25 ;cursor veritcal
CSW EQU $36 ;output vector
MAXCHAR EQU $EF ;total chars per column
FILEPTR EQU $FA ;pointer to active buffer
ENDTEST EQU $D7 ;holds end of file flag
WORDNUM EQU $E3 ;holds # of chars read
BUF1PTR EQU $19 ;pointer to column 1 buffer
BUF2PTR EQU $1B ;pointer to column 2 buffer
*
*---Buffers------------------------
*
LINEBUF EQU $300 ;holds current line buffer
PATHNAME EQU $2B0 ;location of pathname
INBUF EQU $200 ;getln input buffer
BUFFER1 EQU $1000 ;first read to newline
*
ORG $803
JMP START
*
LFT DFB 5 ;left margin
C2 DFB 41 ;start of column2
MAX DFB 35 ;max column width
*
START CLD ;set to binary mode
JSR CLEAR ;prepare RAM & bitmap
MENU LDA #$15 ;<ctrl>-U 80 col off
JSR COUT '40 column only
JSR HOME
LDY #$02
STY TXTLFT ;set left margin of display
STY CV ;vtab 2
JSR VTAB
LDA #$06
STA CH ;htab 6
LDA #TITLE1 ;print title screen
LDY #/TITLE1
JSR STROUT
LDA #$08
STA CH ;htab 8
LDA #TITLE2
LDY #/TITLE2
JSR STROUT
JSR CROUT
LDA #$0C
STA CH ;htab 12
LDA #TITLE3
LDY #/TITLE3
JSR STROUT
LDA #$08
STA TXTLFT ;left margin 8
JSR CROUT
LDY #$14 ;20 "_"s
:M1 LDA #$AD
JSR COUT
DEY
BNE :M1
JSR CROUT
JSR CROUT
LDA #CHOICE1 ;print menu choices
LDY #/CHOICE1
JSR STROUT
JSR CROUT
LDA #CHOICE2
LDY #/CHOICE2
JSR STROUT
JSR CROUT
LDA #CHOICE3
LDY #/CHOICE3
JSR STROUT
LDA #0
STA PATHNAME ;set to null string
STA TXTLFT ;reset left margin
STA CH ;htab 0
LDA #$17
STA CV
JSR VTAB ;vtab 23
LDA #CHOICE4 ;low
LDY #/CHOICE4 ;high
JSR STROUT
*
SELECT JSR RDKEY ;get a choice
CMP #$B1 ;1?
BEQ :S1
CMP #$B2 ;2?
BEQ :S2
CMP #$B3
BEQ :S4
LDA #$87
JSR COUT ;ring bell on error
BNE SELECT
:S1 JSR HOME ;load text file
JSR CLEAR
JSR LOAD
JSR PAUSE ;wait for keypress
JMP MENU ;return to menu
:S2 LDA BUFFER1+1 ;is there text in RAM?
BEQ :S3 ;no-try again
JSR DEST ;print the file
JSR CROUT
JSR CROUT
JSR PAUSE ;wait for keypress
:S3 JMP MENU ;to menu
:S4 JSR HOME
JMP QUIT ;exit program
*
PAUSE LDA #$17 ;23
STA CV
JSR VTAB ;vtab 23
LDA #0
STA CH
LDA #WAIT1
LDY #/WAIT1
JSR STROUT
:1 STA STROBE ;pause for return
JSR RDKEY
STA STROBE
RTS
*
CLEAR LDA #$10 ;Start at $1000 and zero
STA PAGE+1 ;out from page $10 to
LDA #$00 ;page $96 text file memory range
STA PAGE
TAY
LDA #00
:C1 STA (PAGE),Y
INY
BNE :C1
INC PAGE+1
LDX PAGE+1
CPX #$96
BCC :C1
STA EOF
STA EOF+1 ;set eof parmameter
LDX #$03
:C2 STA BITMAP,X
INX
CPX #$13
BCC :C2 ;restore bitmap
LDA #$3F
STA BITMAP,X ;zero pages $10-$96
RTS
*
LOAD JSR PATH ;get pathname
BCS LOAD-1 ;return to try again
JSR GET_ATTR ;get file type
BCS :L2 ;error
LDA FTYPE
CMP #4 ;TXT FILE?
BNE FTYPERR ;no, error
JSR OPEN ;MLI call
BCS :L2 ;error?
LDA REFNUM
STA REF1
STA REF2
STA REF3 ;init reference numbers
STA REF4
JSR GETEOF ;get file length
BCS :L1
LDA EOF
STA RDEOF
LDA EOF+1
STA RDEOF+1 ;set nuber of bytes to read
JSR NEWLINE ;Set newline char
BCS :L1
JSR READ ;Read both buffers
JSR HOME
LDA #TEXTOK ;no errors
LDY #/TEXTOK
JSR STROUT
JMP CLOSE
:L1 JSR CLOSE
:L2 JMP ERROR
FTYPERR JSR CLOSE ;wrong filetype selected
JSR HOME
LDA #$87
JSR COUT
LDA #1
JSR VTAB
LDA #FTERRL
LDY #/FTERRL
JSR STROUT
JSR PAUSE
PLA
PLA
JMP MENU
*
PATH JSR CROUT
JSR CROUT ;scroll 2 lines
LDA #0
STA VOLFLAG ;signal the file request level
LDA #TEXT
LDY #/TEXT
JSR STROUT ;print string
*
PATH2 LDA #$BA ;":" prompt
STA PROMPT
JSR GETLN ;get pathname
CPX #1
BCC :P2
LDA INBUF
CMP #"?" ;CAT requested?
BEQ :P4
STX PATHNAME ;store length in first byte
LDY #$FF
:P1 INY
LDA INBUF,Y ;get pathname and store it
STA PATHNAME+1,Y
CMP #$8D
BNE :P1
LDA #0 ;make ret a 0
INY ;
STA PATHNAME,Y
CLC
RTS ;from PATH
:P2 LDA VOLFLAG ;processing a volume request?
BNE :P3
PLA
PLA
PLA
PLA
JMP MENU ;
:P3 SEC
RTS
:P4 LDA VOLFLAG
BNE :P3 ;do not call CAT from CAT
JSR CAT
BNE PATH ;always
*
DEST JSR INIT
JSR HOME
LDA #$05 ;htab 5
STA CH
STA CV
JSR VTAB ;vtab 5
LDA #WHERE1
LDY #/WHERE1
JSR STROUT
LDA #0
STA CH ;htab 0
LDA #$16
STA CV
JSR VTAB ;vtab 22
LDA #CHOICE4
LDY #/CHOICE4
JSR STROUT
WHICH JSR RDKEY
AND #$DF
CMP #$D0 ;"P"
BNE :W1
JMP PRINTER
:W1 CMP #$D3 ;"S"
BNE :W2
JMP SCREEN
:W2 CMP #$C4 ;"D"
BNE WHICH
JMP DISK
*
CAT JSR HOME
LDA #PROMPT3
STA VOLFLAG ;signal volume name level
LDY #/PROMPT3
JSR STROUT
JSR PATH2 ;get requested prefix
BCS :C0 ;do CAT if no vol specified
JSR SETPREFIX ;set for subsequent cataloging
BCS :C3
:C0 LDY #0
:C1 LDA COMMAND,Y
BEQ :C2
STA INBUF,Y
INY
BNE :C1
:C2 JMP DOSCMD ;call basic system to CAT
:C3 JSR BADCALL
JMP PRINTERR
:C4 RTS
SCREEN JSR HOME
LDA #0
STA CV
STA CH ;reset to full screen
STA TESTPRN ;we are not printing
SCREEN2 LDA CSW+1 ;output vector
PHA
LDA CSW ;low byte is first off
PHA ;push output vectors on stack
LDY #00
STY CSW ; low byte
PRNUM LDA #$C3 ;CSW to 80 col firmware
STA CSW+1 ;high byte
:P1 JSR FIRST
JSR PRINTBUF ;using cout
LDA ENDTEST
CMP #$03 ;EOF?
BNE :P1 ;no do again
PLA ;get low byte
STA CSW
PLA
STA CSW+1 ;restore hooks
RTS ;from SCREEN
*
PRINTER JSR HOME
LDA #WAIT2
STA TESTPRN ;yes we are printing
LDY #/WAIT2
JSR STROUT
LDA SLOT
STA PRNUM+1 ;set output to slot 1
BNE SCREEN2 ;always
*
INIT LDA #$20
LDX #$4F ;79. set length of line here
STX MAXLINE ;holds length of line
INX
STX MAXLINE+1 ;for printer routine
STX MAXWRITE ;for disk write
:1 STA LINEBUF,X ;fill line buffer with spaces
DEX
BPL :1
LDA #0
STA BUF1PTR
STA BUF2PTR ;initialize pointers
STA ENDTEST ;initialize EOF flag
LDA #$10
STA BUF1PTR+1 ;buf1 = $1000
LDA #$60 ;buf2 = $6000
STA BUF2PTR+1
LDA MAX ;set length of line here
STA MAXCHAR ;max line is 35 chars each
LDX C2 ;
STX COL2 ;set start of col2 here
DEX
STX COL1 ;set end of COL1 < COL2
LDA LFT
STA LEFTMAR ;set left margin here
LDA #$C3 ;set output to 80 column firmware
STA PRNUM+1 ;for printing routine
RTS ;from INIT
*
FIRST LDA BUF1PTR
STA FILEPTR
LDA BUF1PTR+1
STA FILEPTR+1 ;set up fileptr to buffer1
LDX #0 ;set to first point on linebuf
LDA ENDTEST
CMP #$01 ;EOF buffer?
BEQ NOMORE ;yes
LDA LEFTMAR ;no
BNE ADDMAR ;indent?
*
FILLINE JSR GETCHAR
CPX COL2 ;which buffer active?
BCS :F1
CLC
LDA WORDNUM ;get offset returned by getchar
ADC BUF1PTR ;update buf1pointer
STA BUF1PTR
BCC SECOND ;get second column
INC BUF1PTR+1
BCS SECOND ;always
:F1 LDA WORDNUM ;get number of chars used
CLC
ADC BUF2PTR ;update buf2ptr
STA BUF2PTR
BCC S1
INC BUF2PTR+1
BNE S1
SECOND LDA BUF2PTR
STA FILEPTR
LDA BUF2PTR+1
STA FILEPTR+1 ;set to buffer2
LDX COL2 ;set to enter at start of col2
LDA ENDTEST
CMP #$02 ;EOF buffer2?
BCS NOMORE
BCC FILLINE ;always
S1 LDA #$0D
STA LINEBUF,X
RTS ;from FIRST
*
NOMORE JSR FILLSPC ;fill rest of line with spaces
CPX COL2 ;which buffer is active?
BCC SECOND ;first
BCS S1 ;from FIRST
*
ADDMAR LDA #$20
:AD1 STA LINEBUF,X ;fill line with leading spaces
INX
CPX LEFTMAR ;enough?
BCC :AD1
BCS FILLINE
*
FILLSPC LDA #$20 ;space
:F1 STA LINEBUF,X ;fill remainder of column with spaces
INX
CPX COL1 ;column 1 finished?
BEQ :F2
CPX MAXLINE ;column2 finished?
BCC :F1
:F2 RTS ;from FILSPC
*
INDENT TYA
PHA ;save Y register
LDY #$03
LDA #$20
:1 STA LINEBUF,X ;store a space
INX
DEY
BNE :1 ;indent 3 spaces
PLA
TAY ;restore Y register
JMP G2
*
GTSPC CPX LEFTMAR ;leading space?
BEQ G2 ;yes, disregard
CPX COL2 ;leading space?
BEQ G2 ;ditto...
BNE G1 ;else return & print space
*
GETCHAR LDY #0 ;Y holds buffer offset
*
CHLOOP LDA (FILEPTR),Y
BEQ EOFND
CMP #$0D ;carriage return?
BEQ RET ;fill remainder w/ spaces
CMP #$20 ;leading space?
BEQ GTSPC
BCC G2 ;ignore <CTRL> chars
CMP #$5E ;"^" char?
BEQ INDENT
CMP NEWCHAR ;@ char?
BEQ G2 ;ignore...
G1 STA LINEBUF,X ;store in line buffer
INX ; increment
G2 INY
CPY MAXCHAR ;Full 35 chars?
BCC CHLOOP
TEST CMP #$20 ;space?
BEQ OK
CMP #$2E ;period?
BEQ OK
CMP #$2C ;comma?
BEQ OK
DEY ;ELSE decrement and find end
DEX
CPY #$08 ;are we going back too far?
BEQ TOOFAR ;yes
LDA LINEBUF,X
BNE TEST ;always
*
RET INY ;advance fileptr past <CR>
OK DEX ;reset line pointer
OK1 LDA #$20 ;space
:O1 INX
STA LINEBUF,X
CPX COL1 ;finished?
BEQ FULL
CPX MAXLINE ;finished?
BCS FULL
BNE :O1 ;always
*
EOFND CPX COL2 ;which buffer are we in?
BCC :E1 ;buffer1
CLC
LDA #02
ADC ENDTEST
STA ENDTEST
BNE OK ;add spaces if needed
:E1 CLC
LDA #01
ADC ENDTEST
STA ENDTEST
BNE OK ;ditto
FULL STY WORDNUM ;save offset to add to pointer
RTS ;from GETCHAR
TOOFAR LDA (FILEPTR),Y ;this section refills the buffer
STA LINEBUF,X ;if we are going back too far
INX
INY
CPY MAXCHAR ;full?
BCC TOOFAR
BCS OK1 ;when done
*
PRINTBUF LDX #0 ;set offset
:P1 LDA LINEBUF,X ;get a character
ORA #$80 ;set high bit
JSR COUT ;print it
INX ;next
CPX MAXLINE+1 ;done?
BCC :P1 ;no
LDA KEYBD ;key pressed?
CMP #$80
BCC :P3 ;no
BIT STROBE ;yes
CMP #$9B ;<esc>?
BEQ :P2
LDA TESTPRN
BNE :P3
JMP RDKEY ;stop scroll
:P2 LDA #3
STA ENDTEST
:P3 RTS ;from PRINTBUF
*
RETRY JSR PAUSE
DISK JSR HOME
LDA #00
STA VOLFLAG ;not a volume request
STA PATHNAME ;remove previous input
LDA #PROMPT4
LDY #/PROMPT4
JSR STROUT
JSR PATH2 ;get pathname
BCS RETRY ;if not successful
JSR HOME
LDA #PROMPT5
LDY #/PROMPT5
JSR STROUT
LDA #PATHNAME+1
LDY #/PATHNAME+1
JSR STROUT
JSR CREATE ;create new text file
BCS :2
JSR OPEN ;open file
BCS :2
LDA REFNUM ;get reference number returned
STA REFWRT ;set it to write call
STA REF4
:1 JSR FIRST ;fill line buff
JSR WRITE ;write linebuf to disk
BCS :2
LDA ENDTEST
CMP #$03 ;EOF?
BNE :1
JMP CLOSE ;return
:2 JMP ERROR
*
QUIT LDA #11
STA CV
JSR VTAB
LDA #PROMPT1
LDY #/PROMPT1
JSR STROUT
JSR RDKEY
CMP #$D9 ;"Y"?
BEQ :Q1
CMP #$F9 ;"y"?
BEQ :Q1
JMP MENU ;no. return
:Q1 JSR HOME ;clear screen
LDA #"]" ;restore ] prompt
STA PROMPT
LDA #23
STA CV
JSR VTAB ;put cursor in bottom
LDA #0
STA $800
STA $800+1
STA $800+2
JSR $3D0 ;return to DOS
*
* MLI Subroutines
*
OPEN LDA #3
STA LEVEL ;Set access level to 3
JSR MLI
DFB $C8 ;open file
DA PARM0 ;parameters
RTS
*
GETEOF JSR MLI
DFB $D1 ;Get_EOF
DA PARM1
RTS
*
NEWLINE JSR MLI
DFB $C9
DA PARM4
RTS
*
READ LDA #00
STA BUFADDR
LDA #$10
STA BUFADDR+1 ;set to read buffer1
JSR MLI
DFB $CA ;read first column
DA PARM2
BCS :R1
*
LDA #$60
STA BUFADDR+1 ;reset for next read
LDA #0
STA BUFADDR
*
JSR MLI
DFB $CA ;read next column
DA PARM2
BCS :R1
RTS
:R1 PLA
PLA
JMP ERROR
*
CLOSE JSR MLI
DFB $CC ;close file
DA PARM3
RTS
*
CREATE JSR MLI
DFB $C0
DA PARM6
RTS
*
WRITE JSR MLI
DFB $CB
DA PARM7
RTS
*
SETPREFIX JSR MLI
DFB $C6
DA PARM8
RTS
GET_ATTR JSR MLI
DFB $C4
DA PARM9
RTS
*
*
ERROR CMP #$40
BEQ ERR1
JSR BADCALL ;convert MLI error to BI code
PHA
JSR HOME
PLA
JSR PRINTERR ;let BI handle error
RETURN JSR PAUSE ;read error msg
PLA
PLA ;pull return address of stack
JMP MENU ;and start over
*
ERR1 JSR HOME
LDA #ERRTEXT1
LDY #/ERRTEXT1
JSR STROUT
BEQ RETURN
*
* PARM TABLES
*
*---Open file parms-----------------
*
PARM0 DFB 3 ;# of parameters
DA PATHNAME
DA $9000
REFNUM DS 1 ;reference number
*
*---Get EOF parms------------------
*
PARM1 DFB 2 ;2 parms
REF1 DFB 1 ;reference number
EOF DS 3
*
*---Read file parms----------------
*
PARM2 DFB 4 ;# of parameters
REF2 DFB 1 ;reference number
BUFADDR DA BUFFER1 ;buffer pointer
RDEOF DW $0000 ;# of bytes to read
DS 2 ;number of bytes actually read
*
*---Close file parms---------------
*
PARM3 DFB 1
REF4 DFB 1
*
*---Newline parms-------------------
*
PARM4 DFB 3
REF3 DFB 1
DFB $7F ;enable mask
NEWCHAR DFB $40 ;'@' newline char
*
*---Create parms--------------------
*
PARM6 DFB 7
DA PATHNAME
DFB $E3
DFB $04
DW 0
DFB 1
DW 0
DW 0
*
*---Write parms---------------------
*
PARM7 DFB $4
REFWRT DS 1
DA LINEBUF
MAXWRITE DS 2 ;number of bytes read
DS 2 ;number actually written
*
*---Set Prefix parms---------------
*
PARM8 DFB 1
DA PATHNAME
*
*-----Get_Attr parms---------------
*
PARM9 DFB #$A
DA PATHNAME
DS 1
FTYPE DS 1
DS 9
*---Variables----------------------
*
COL1 DS 1 ;start of first column
COL2 DS 1 ;start of second column
LEFTMAR DS 1 ;left margin
MAXLINE DS 2 ;max # of chars per line
SLOT DFB $C1 ;high byte of printer slot
VOLFLAG DS 1 ;flag vol or path level of processing
TESTPRN DS 1
*
* Text strings
*
TEXT ASC "ENTER FILENAME "
HEX 8D
ASC "OR ? FOR CAT"
DFB 00
ERRTEXT1 HEX 8D8A07
ASC "INVALID PATHNAME "
DFB 00
TEXTOK HEX 8D8D
ASC "TEXT FILE SUCCESSFULLY LOADED"
DFB 0
TITLE1 ASC "NEWSMAKER TEXT PRINTER"
HEX 8D00
TITLE2 ASC "BY JOHN J. GWYNN"
HEX 8D
ASC "COPYRIGHT 1988 BY MICROSPARC, INC."
HEX 8D00
TITLE3 ASC "MAIN MENU"
HEX 8D00
CHOICE1 ASC "1. LOAD TEXT FILE"
HEX 8D00
CHOICE2 ASC "2. PRINT TEXT FILE"
HEX 8D00
CHOICE3 ASC "3. QUIT"
DFB 0
CHOICE4 ASC "ENTER CHOICE => "
DFB 0
WAIT1 ASC "PRESS RETURN TO CONTINUE..."
DFB 0
WAIT2 ASC "PRINTING ; PLEASE WAIT...PRESS ESCAPE TO STOP"
HEX 8D00
WHERE1 ASC "(S)CREEN (P)RINTER (D)ISK"
DFB 0
PROMPT1 ASC "QUIT? (Y/N) "
DFB 0
PROMPT2 ASC "MUST BE A VALID PATHNAME OR ?"
HEX 8D8D00
PROMPT3 ASC "ENTER PREFIX OR "
HEX 8D
ASC "PRESS RETURN FOR CURRENT PREFIX"
HEX 8D
DFB 0
PROMPT4 HEX 8D8D
ASC "NEW FILE NAME "
DFB 0
PROMPT5 HEX 8D8D
ASC "CREATING "
DFB 0
COMMAND ASC "CAT"
HEX 8D00
FTERRL ASC "MUST BE TEXT FILE "
DFB 00